DeeDeeExperiment for managing and exploring omics analysis resultsResearch Associate, PhD Student
Bioinformatics Group
Institute of Medical Biostatistics, Epidemiology and Informatics (IMBEI), Mainz, Germany
EuroBioC2025, Barcelona, Spain
September 17, 2025
Problem
DeeDeeExperiment to structure and store DEA and FEA results in one place, based on the SingleCellExpriment objectNote
DeeDeeExperiment won’t do the analysis for you, it’s a container
DeeDeeExperiment objectclass: DeeDeeExperiment
dim: 1000 24
metadata(7): tximetaInfo quantInfo ... txdbInfo version
assays(7): counts abundance ... H cooks
rownames(1000): ENSG00000164741 ENSG00000078808 ... ENSG00000273680
ENSG00000073536
rowData names(58): gene_id SYMBOL ... Salm_vs_naive_pvalue
Salm_vs_naive_padj
colnames(24): SAMEA103885102 SAMEA103885347 ... SAMEA103885308
SAMEA103884949
colData names(15): names sample_id ... condition line
reducedDimNames(0):
mainExpName: NULL
altExpNames(0):
dea(2): IFNg_vs_naive, Salm_vs_naive
fea(0):
Note
Supported DE result types: DESeqResults, DGEExact, DGELRT, MArrayLM, or data.frame
dde objectclass: DeeDeeExperiment
dim: 1000 24
metadata(7): tximetaInfo quantInfo ... txdbInfo version
assays(7): counts abundance ... H cooks
rownames(1000): ENSG00000164741 ENSG00000078808 ... ENSG00000273680
ENSG00000073536
rowData names(61): gene_id SYMBOL ... de_limma_pvalue de_limma_padj
colnames(24): SAMEA103885102 SAMEA103885347 ... SAMEA103885308
SAMEA103884949
colData names(15): names sample_id ... condition line
reducedDimNames(0):
mainExpName: NULL
altExpNames(0):
dea(3): IFNg_vs_naive, Salm_vs_naive, de_limma
fea(0):
[1] "Salm_vs_naive_log2FoldChange" "Salm_vs_naive_pvalue"
[3] "Salm_vs_naive_padj" "de_limma_log2FoldChange"
[5] "de_limma_pvalue" "de_limma_padj"
dde object→ Can be added to a dde object using the addFEA() method.
# add FEA results as a named list
dde <- addFEA(dde,
fea = list(IFNg_vs_naive = topGO_results_list$ifng_vs_naive))
# add FEA results as a single object
dde <- addFEA(dde, fea = gost_res$result)
# add FEA results and specify the FEA tool
dde <- addFEA(dde, fea = clusterPro_res, fea_tool = "clusterProfiler")dde object
✔ Assigning DEA: "IFNg_vs_naive" to FEA "IFNg_vs_naive"
✔ Assigning DEA: "IFNg_vs_naive" to FEA "gost_res$result"
dde objectDE Results Summary:
DEA_name Up Down FDR
IFNg_vs_naive 36 17 0.05
Salm_vs_naive 90 34 0.05
de_limma 265 303 0.05
same_contrast 265 303 0.05
FE Results Summary:
FEA_Name Linked_DE FE_Type Term_Number
IFNg_vs_naive IFNg_vs_naive topGO 955
gost_res$result IFNg_vs_naive gProfiler 2095
ifng_vs_naive . clusterProfiler 20
salmonella_vs_naive . clusterProfiler 11
dde objectDE Results Summary:
DEA_name Up Down FDR
IFNg_vs_naive 30 15 0.01
Salm_vs_naive 80 29 0.01
de_limma 203 244 0.01
same_contrast 203 244 0.01
FE Results Summary:
FEA_Name Linked_DE FE_Type Term_Number
IFNg_vs_naive IFNg_vs_naive topGO 955
gost_res$result IFNg_vs_naive gProfiler 2095
ifng_vs_naive . clusterProfiler 20
salmonella_vs_naive . clusterProfiler 11
dde objectDE Results Summary:
DEA_name Up Down FDR
IFNg_vs_naive 36 17 0.05
Salm_vs_naive 90 34 0.05
de_limma 265 303 0.05
same_contrast 265 303 0.05
FE Results Summary:
FEA_Name Linked_DE FE_Type Term_Number
IFNg_vs_naive IFNg_vs_naive topGO 955
gost_res$result IFNg_vs_naive gProfiler 2095
ifng_vs_naive . clusterProfiler 20
salmonella_vs_naive . clusterProfiler 11
Scenario Info:
- IFNg_vs_naive :
This results contains the output of a Differential Expression Analysis
performed on data from the `macrophage` package, more precisely contrasting
the counts from naive macrophage to those associated with IFNg.
No scenario info for: Salm_vs_naive, de_limma, same_contrast
dde object
[1] "IFNg_vs_naive" "Salm_vs_naive" "de_limma" "same_contrast"
Tip
To retrieve the names of available FEAs in a dde object, use getFEANames()
dde object| IFNg_vs_naive_log2FoldChange | IFNg_vs_naive_pvalue | IFNg_vs_naive_padj | |
|---|---|---|---|
| ENSG00000164741 | 0.2291487 | 0.9805414 | 1 |
| ENSG00000078808 | -0.0115336 | 1.0000000 | 1 |
| ENSG00000251034 | -0.1167013 | 0.9338990 | 1 |
| ENSG00000162676 | 0.2691481 | 0.9008170 | 1 |
| ENSG00000170356 | -0.1278637 | 0.9728148 | 1 |
| ENSG00000204257 | 4.0550244 | 0.0000000 | 0 |
dde object| Salm_vs_naive_log2FoldChange | Salm_vs_naive_pvalue | Salm_vs_naive_padj | |
|---|---|---|---|
| ENSG00000164741 | 0.0114691 | 0.9996325 | 1.0000000 |
| ENSG00000078808 | 0.7893601 | 0.9975592 | 1.0000000 |
| ENSG00000251034 | 1.1881497 | 0.2269175 | 0.9820422 |
| ENSG00000162676 | 0.4420821 | 0.8432117 | 1.0000000 |
| ENSG00000170356 | -0.6249201 | 0.7269723 | 1.0000000 |
| ENSG00000204257 | -0.7293810 | 0.8838883 | 1.0000000 |
dde objectlist$IFNg_vs_naive
log2FoldChange pvalue padj
ENSG00000164741 0.22914866 9.805414e-01 1.00000e+00
ENSG00000078808 -0.01153364 1.000000e+00 1.00000e+00
ENSG00000251034 -0.11670132 9.338990e-01 1.00000e+00
ENSG00000162676 0.26914813 9.008170e-01 1.00000e+00
ENSG00000170356 -0.12786371 9.728148e-01 1.00000e+00
ENSG00000204257 4.05502439 1.672976e-56 8.36488e-54
$Salm_vs_naive
log2FoldChange pvalue padj
ENSG00000164741 0.0114691 0.9996325 1.0000000
ENSG00000078808 0.7893601 0.9975592 1.0000000
ENSG00000251034 1.1881497 0.2269175 0.9820422
ENSG00000162676 0.4420821 0.8432117 1.0000000
ENSG00000170356 -0.6249201 0.7269723 1.0000000
ENSG00000204257 -0.7293810 0.8838883 1.0000000
$de_limma
log2FoldChange pvalue padj
ENSG00000164741 -0.07694397 8.044824e-01 8.540153e-01
ENSG00000078808 0.78155238 1.672966e-08 3.510702e-07
ENSG00000251034 1.32914271 1.704072e-02 3.215229e-02
ENSG00000162676 0.65022935 1.042612e-01 1.546902e-01
ENSG00000170356 -0.35191649 4.004132e-01 4.877139e-01
ENSG00000204257 -0.79077889 2.294410e-03 5.721721e-03
$same_contrast
log2FoldChange pvalue padj
ENSG00000164741 -0.07694397 8.044824e-01 8.540153e-01
ENSG00000078808 0.78155238 1.672966e-08 3.510702e-07
ENSG00000251034 1.32914271 1.704072e-02 3.215229e-02
ENSG00000162676 0.65022935 1.042612e-01 1.546902e-01
ENSG00000170356 -0.35191649 4.004132e-01 4.877139e-01
ENSG00000204257 -0.79077889 2.294410e-03 5.721721e-03
Accessing FEA results
getFEA() directly accesses specific FEA results.
getFEAList() returns all FEAs stored in a dde object. Optionally, if dea_name is set, it returns all FEAs linked to a specific DEA.
dde object
✔ Renamed DEA entries: "de_limma" to "ifng_vs_naive_&_salm_vs_naive"
✔ Renamed DEA entries: "same_contrast" and "Salm_vs_naive" to "same_contrast_new" and "Salm_vs_naive_new"
Tip
To rename FEAs stored in a dde object, use renameFEA()
dde object
Tip
To remove FEAs stored in a dde object, use removeFEA()
dea/fea using getDEAInfo()/getFEAInfo()
[1] "DESeq2"
[1] 0.05
force = TRUE
class: DeeDeeExperiment
dim: 1000 24
metadata(7): tximetaInfo quantInfo ... txdbInfo version
assays(7): counts abundance ... H cooks
rownames(1000): ENSG00000164741 ENSG00000078808 ... ENSG00000273680
ENSG00000073536
rowData names(58): gene_id SYMBOL ... same_contrast_pvalue
same_contrast_padj
colnames(24): SAMEA103885102 SAMEA103885347 ... SAMEA103885308
SAMEA103884949
colData names(15): names sample_id ... condition line
reducedDimNames(0):
mainExpName: NULL
altExpNames(0):
dea(2): IFNg_vs_naive, same_contrast
fea(4): IFNg_vs_naive, gost_res$result, ifng_vs_naive, salmonella_vs_naive
original format (default format = "minimal")| baseMean | log2FoldChange | lfcSE | pvalue | padj | |
|---|---|---|---|---|---|
| ENSG00000164741 | 918.03469 | 0.2291487 | 0.3006751 | 0.9805414 | 1 |
| ENSG00000078808 | 6684.47548 | -0.0115336 | 0.0729923 | 1.0000000 | 1 |
| ENSG00000251034 | 12.12408 | -0.1167013 | 0.4049828 | 0.9338990 | 1 |
| ENSG00000162676 | 10.22204 | 0.2691481 | 0.3776971 | 0.9008170 | 1 |
| ENSG00000170356 | 15.07716 | -0.1278637 | 0.3522078 | 0.9728148 | 1 |
| ENSG00000204257 | 1922.02562 | 4.0550244 | 0.1960055 | 0.0000000 | 0 |
muscat::pbDS() → DeeDeeExperiment)# create res, a list to hold pseudobulk DE results for all contrasts
for (i in names(contrast)) {
cat("Contrast: ", i,"\n")
res <- pbDS(pb,
design = mm,
contrast = contrast[[i]],
verbose = TRUE,
BPPARAM = BiocParallel::MulticoreParam(6))
results_list[[i]] <- res
}
# extract contrast
contrast_vtp_DMSO <- res$table$`VTP-DMSO`
# renaming columns
for (cell in names(contrast_vtp_DMSO)) {
contrast_vtp_DMSO[[cell]] <-
contrast_vtp_DMSO[[cell]] |>
dplyr::rename(log2FoldChange = logFC,
pvalue = p_val,
padj = p_adj.loc)
rownames(contrast_vtp_DMSO[[cell]]) <- contrast_vtp_DMSO[[cell]]$gene
}
# optional: update de + enrich list names
new_names <- c(
"NK1 A+B" = "NK1_A_B",
"NK1 C" = "NK1_C",
"NK2" = "NK2",
"NK3" = "NK3" ,
"NKint" = "NKint"
)
names(contrast_vtp_DMSO) <- new_names[names(contrast_vtp_DMSO)]
names(func_res) <- new_names[names(func_res)]
# create dde object
dde <- DeeDeeExperiment(sce_NKcells, # sce object
de_results = contrast_vtp_DMSO, # DEA results
enrich_results = func_res # FEA results
)DeeDeeExperiment objectsDeeDeeExperiment objects can be used with other Bioconductor tools like iSEE & GeneTonic, or anything that works for a SCE object
DeeDeeExperiment is available on Bioconductorhttps://bioconductor.org/packages/DeeDeeExperiment